package com.lancoo.edu.platform.operation.commons.controller.base;

import com.lancoo.edu.platform.operation.commons.dto.BaseResult;
import com.lancoo.edu.platform.operation.commons.dto.BaseResultFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.ModelAttribute;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * 统一的 Controller
 * @author pky
 */
//解决跨域
@CrossOrigin(allowCredentials = "true")
public class BaseResultController {
    @Resource
    protected HttpServletRequest request;
    @Resource
    protected HttpServletResponse response;

    /**
     * 在所有的 @RequestMapping 前执行
     */
    @ModelAttribute
    public void initReqAndRes(HttpServletRequest request, HttpServletResponse response) {
        this.request = request;
        this.response = response;
    }

    /**
     * 查询响应结果
     *
     * @param code 状态码
     * @param msg  说明
     * @return Result 响应结果
     */
    protected BaseResult result(int code, String msg) {
        response.setStatus(code);
        return BaseResultFactory.getInstance((response)).build(code, msg);
    }

    /**
     * 多笔响应结果
     *
     * @param code       状态码
     * @param msg        说明
     * @param attributes domain实体
     * @return Result 响应结果
     */
    protected <T> BaseResult result(int code, String msg, List<T> attributes) {
        response.setStatus(code);
        return BaseResultFactory.getInstance(response).build(code, msg, attributes);
    }

    /**
     * 无数据成功固定说明结果
     *
     * @return Result 响应结果
     */
    protected BaseResult success() {
        return BaseResultFactory.getInstance(response).build();
    }

    /**
     * 无数据成功带说明结果
     *
     * @param msg 说明
     * @return Result 响应结果
     */
    protected BaseResult success(String msg) {
        return BaseResultFactory.getInstance(response).build(msg);
    }

    /**
     * 单笔固定说明结果
     *
     * @param attribute 数据实体
     * @return Result 响应结果
     */
    protected <T> BaseResult success(T attribute) {
        return BaseResultFactory.getInstance(response).build(attribute);
    }

    /**
     * 多笔固定说明结果
     *
     * @param attributes 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult success(List<T> attributes) {
        return BaseResultFactory.getInstance(response).build(attributes);
    }

    /**
     * 单笔带说明结果
     *
     * @param msg       说明
     * @param attribute 数据实体
     * @return Result 响应结果
     */
    protected <T> BaseResult success(String msg, T attribute) {
        return BaseResultFactory.getInstance(response).build(msg, attribute);
    }

    /**
     * 多笔带说明结果
     *
     * @param msg        说明
     * @param attributes 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult success(String msg, List<T> attributes) {
        return BaseResultFactory.getInstance(response).build(msg, attributes);
    }

    /**
     * 多笔分页结果
     *
     * @param total      总条数
     * @param attributes 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult success(long total, List<T> attributes) {
        return BaseResultFactory.getInstance(response).build(total, attributes);
    }

    /**
     * 健康结果
     *
     * @param attribute 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult successHealth(T attribute) {
        return BaseResultFactory.getInstance(response).buildHealth(attribute);
    }

    /**
     * 健康结果
     *
     * @param error     状态码
     * @param msg       说明
     * @param attribute 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult successHealth(int error, String msg, T attribute) {
        return BaseResultFactory.getInstance(response).buildHealth(error, msg, attribute);
    }

    /**
     * 固定状态码和说明的错误结果
     *
     * @return Result 响应结果
     */
    protected BaseResult error() {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        return BaseResultFactory.getInstance(response).build(400, "error");
    }

    /**
     * 固定状态码的错误结果
     *
     * @param msg 说明
     * @return Result 响应结果
     */
    protected BaseResult error(String msg) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        return BaseResultFactory.getInstance(response).build(400, msg);
    }

    /**
     * 错误结果
     *
     * @param code 状态码
     * @param msg  说明
     * @return Result 响应结果
     */
    protected BaseResult error(int code, String msg) {
        response.setStatus(code);
        return BaseResultFactory.getInstance(response).build(code, msg);
    }

    /**
     * 错误结果
     *
     * @param code 状态码
     * @param msg  说明
     * @return Result 响应结果
     */
    protected BaseResult errorHealth(int code, String msg) {
        response.setStatus(HttpStatus.OK.value());
        return BaseResultFactory.getInstance(response).buildHealth(code, msg);
    }

    /**
     * 错误结果--无固定状态码
     *
     * @param code 状态码
     * @param msg  说明
     * @return Result 响应结果
     */
    private BaseResult errorAppMgr(int code,String msg){
        response.setStatus(code);
        return BaseResultFactory.getInstance(response).buildAppMgr(code,msg);
    }

    /**
     * 错误结果--固定状态码
     *
     * @param msg  说明
     * @return Result 响应结果
     */
    protected BaseResult errorAppMgr(String msg){
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        return BaseResultFactory.getInstance(response).buildAppMgr(HttpStatus.BAD_REQUEST.value(),msg);
    }

    /**
     * 多笔固定说明结果
     *
     * @param attributes 数据集
     * @return Result 响应结果
     */
    protected <T> BaseResult successAppMgr(List<T> attributes) {
        return BaseResultFactory.getInstance(response).buildAppMgr(attributes);
    }

    /**
     * 单笔固定结果
     *
     * @param attribute 数据实体
     * @return Result 响应结果
     */
    protected <T> BaseResult successAppMgr(T attribute) {
        return BaseResultFactory.getInstance(response).buildAppMgr(attribute);
    }

    /**
     * 设置请求头
     *
     * @param response 响应
     * @param fileName 文件名
     */
    protected void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
